home *** CD-ROM | disk | FTP | other *** search
/ Aminet 13 / Aminet 13 - August 1996.iso / Aminet / dev / e / energy.lha / Energy / Easy / opta.e < prev    next >
Text File  |  1996-05-18  |  2KB  |  88 lines

  1.  
  2.     /* opta.e */
  3.  
  4. MODULE     'dos/dos',
  5.     'dos/dosextens',
  6.     'exec/memory'
  7.  
  8. PROC main()
  9.  
  10. DEF    oldlock:PTR TO filelock
  11.        
  12.         /* fissa un lock di lettura sulla directory corrente */
  13.     
  14.            oldlock := Lock('',ACCESS_READ)
  15.            IF (oldlock <> 0)
  16.                   followthread(oldlock,0)
  17.            ELSE
  18.                   WriteF('\n Non posso fissare un lock sulla directory corrente')
  19.            ENDIF
  20.     WriteF('\n')
  21.  
  22. ENDPROC
  23.     
  24.     /* Ora scende ricorsivamente lungo le directory listandole e listandone i contenuti*/
  25.     
  26. PROC followthread(lock:PTR TO filelock,tab_level=0)   
  27.     
  28. DEF    m:PTR TO fileinfoblock,
  29.        newlock:PTR TO filelock,
  30.     oldlock:PTR TO filelock,
  31.     ignoredlock:PTR TO filelock,
  32.        success,i
  33.        
  34.                    /* se è arrivato in fondo npn stampa nulla */
  35.            IF (lock)=FALSE THEN RETURN 0   
  36.  
  37.                 /* alloca spazio per un fileinfoblock */
  38.  
  39.            m := AllocMem(SIZEOF fileinfoblock,MEMF_CLEAR)
  40.     
  41.            success := Examine(lock,m)
  42.        
  43.                /* la prima chiamata di examine riempie la                              * FileInfoBlock con le informazioni riguardanti la 
  44.              * directory. Se si trova al primo livello stampa
  45.              * il nome del disco.
  46.                */
  47.     
  48.            WHILE (success <> 0)
  49.  
  50.               IF (m.direntrytype > 0)
  51.  
  52.              /* sè è una directory, prendere un lock su di essa e 
  53.              * entra all'interno per elencare i suoi contenuti come pure il 
  54.              * nome delle directory */
  55.     
  56.              newlock := Lock(m.filename,ACCESS_READ)
  57.     
  58.              /* Se il lock è valido rende questa directory
  59.                quella corrente ma salva il valore del
  60.                lock precedente                 
  61.             */
  62.     
  63.          oldlock := CurrentDir(newlock)    /* si sposta in tale directory */
  64.     
  65.              /* fa la stessa cosa ricorsivamente sino in fondo */
  66.  
  67.              followthread(newlock,tab_level+1)
  68.     
  69.              /* dopo aver listato il contenuto della nuova directory torna qui */
  70.  
  71.          ignoredlock := CurrentDir(oldlock)  /* e procede */
  72.               ENDIF
  73.         success := ExNext(lock, m)    /* esamina la prossima */
  74.               IF (success)
  75.  
  76.                   WriteF('\n')
  77.                   FOR i:=0 TO i<tab_level DO WriteF('\t')
  78.         /* opera un tab per mostare il livello della directory */
  79.                         WriteF(m.filename)
  80.                       IF (m.direntrytype > 0) THEN WriteF(' [dir]')    
  81.                 /* dice all'utente che è una directory */
  82.              ENDIF
  83.             ENDWHILE
  84.  
  85.        IF (lock) THEN UnLock(lock)
  86.        FreeMem(m,SIZEOF fileinfoblock)
  87. ENDPROC
  88.